/**
 * 本文件功能：公共JavaScript函数
 * 版权声明：保留发行权和署名权
 * 作者信息：15058593138@qq.com
 */

// 获取当前版本号，防止缓存
const VERSION = new Date().getTime();

/**
 * AJAX通信函数
 * @param {Object} options 配置项
 * @param {string} options.url 请求地址
 * @param {string} options.method 请求方法
 * @param {Object} options.data 请求数据
 * @param {Function} options.success 成功回调
 * @param {Function} options.error 失败回调
 */
function ajax(options) {
    const xhr = new XMLHttpRequest();
    
    // 默认值
    options = options || {};
    options.method = options.method || 'GET';
    options.data = options.data || {};
    
    // 处理GET请求参数
    let url = options.url;
    if (options.method.toUpperCase() === 'GET' && Object.keys(options.data).length > 0) {
        url += '?' + objectToParams(options.data);
    }
    
    // 打开连接
    xhr.open(options.method, url, true);
    
    // 设置请求头
    if (options.method.toUpperCase() === 'POST') {
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    }
    
    // 处理响应
    xhr.onreadystatechange = function() {
        if (xhr.readyState === 4) {
            if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) {
                let response;
                try {
                    response = JSON.parse(xhr.responseText);
                } catch (e) {
                    response = xhr.responseText;
                }
                
                if (options.success && typeof options.success === 'function') {
                    options.success(response);
                }
            } else {
                if (options.error && typeof options.error === 'function') {
                    options.error(xhr.status, xhr.statusText);
                }
            }
        }
    };
    
    // 发送请求
    if (options.method.toUpperCase() === 'POST') {
        xhr.send(objectToParams(options.data));
    } else {
        xhr.send();
    }
}

/**
 * 将对象转换为URL参数
 * @param {Object} obj 对象
 * @return {string} URL参数字符串
 */
function objectToParams(obj) {
    const params = [];
    
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            params.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]));
        }
    }
    
    return params.join('&');
}

/**
 * 获取表单数据
 * @param {string} formId 表单ID
 * @return {Object} 表单数据对象
 */
function getFormData(formId) {
    const form = document.getElementById(formId);
    if (!form) return {};
    
    const data = {};
    const elements = form.elements;
    
    for (let i = 0; i < elements.length; i++) {
        const element = elements[i];
        
        if (element.name) {
            if (element.type === 'checkbox' || element.type === 'radio') {
                if (element.checked) {
                    data[element.name] = element.value;
                }
            } else if (element.type !== 'button' && element.type !== 'submit' && element.type !== 'reset') {
                data[element.name] = element.value;
            }
        }
    }
    
    return data;
}

/**
 * 显示吐司提示
 * @param {string} message 提示消息
 * @param {number} duration 显示时长（毫秒）
 */
function showToast(message, duration) {
    duration = duration || 3000;
    
    // 移除已有的吐司
    const existToast = document.querySelector('.toast');
    if (existToast) {
        document.body.removeChild(existToast);
    }
    
    // 创建新吐司
    const toast = document.createElement('div');
    toast.className = 'toast';
    toast.textContent = message;
    
    document.body.appendChild(toast);
    
    // 自动关闭
    setTimeout(function() {
        if (document.body.contains(toast)) {
            document.body.removeChild(toast);
        }
    }, duration);
}

/**
 * 显示遮罩层
 * @param {string} title 标题
 * @param {string} content 内容
 * @param {Array} buttons 按钮配置
 */
function showModal(title, content, buttons) {
    // 移除已有的遮罩
    const existMask = document.querySelector('.mask');
    if (existMask) {
        document.body.removeChild(existMask);
    }
    
    // 创建遮罩
    const mask = document.createElement('div');
    mask.className = 'mask';
    
    // 创建模态框
    const modal = document.createElement('div');
    modal.className = 'modal';
    
    // 头部
    const header = document.createElement('div');
    header.className = 'modal-header';
    
    const titleElement = document.createElement('div');
    titleElement.className = 'modal-title';
    titleElement.textContent = title;
    
    const closeBtn = document.createElement('div');
    closeBtn.className = 'modal-close';
    closeBtn.textContent = '×';
    closeBtn.onclick = function(e) {
        e.preventDefault();
        e.stopPropagation();
        document.body.removeChild(mask);
    };
    
    header.appendChild(titleElement);
    header.appendChild(closeBtn);
    
    // 内容
    const body = document.createElement('div');
    body.className = 'modal-body';
    
    if (typeof content === 'string') {
        body.innerHTML = content;
    } else if (content instanceof HTMLElement) {
        body.appendChild(content);
    }
    
    // 底部按钮
    const footer = document.createElement('div');
    footer.className = 'modal-footer';
    
    if (buttons && buttons.length) {
        buttons.forEach(function(btnConfig) {
            const btn = document.createElement('button');
            btn.className = btnConfig.class || 'btn';
            btn.textContent = btnConfig.text || '确定';
            
            if (btnConfig.onClick && typeof btnConfig.onClick === 'function') {
                btn.onclick = function(e) {
                    e.preventDefault();
                    e.stopPropagation();
                    btnConfig.onClick(e);
                };
            }
            
            footer.appendChild(btn);
        });
    } else {
        // 默认按钮
        const btn = document.createElement('button');
        btn.className = 'btn btn-primary';
        btn.textContent = '确定';
        btn.onclick = function(e) {
            e.preventDefault();
            e.stopPropagation();
            document.body.removeChild(mask);
        };
        
        footer.appendChild(btn);
    }
    
    // 组装
    modal.appendChild(header);
    modal.appendChild(body);
    modal.appendChild(footer);
    mask.appendChild(modal);
    
    document.body.appendChild(mask);
    
    return {
        mask: mask,
        modal: modal,
        close: function() {
            if (document.body.contains(mask)) {
                document.body.removeChild(mask);
            }
        }
    };
}

/**
 * 分页函数
 * @param {Object} options 配置项
 * @param {string} options.url 请求地址
 * @param {string} options.container 容器选择器
 * @param {string} options.pagingContainer 分页容器选择器
 * @param {Function} options.render 渲染函数
 * @param {Object} options.params 请求参数
 */
function loadPage(options) {
    options = options || {};
    options.params = options.params || {};
    
    // 添加页码参数
    options.params.page = options.params.page || 1;
    
    // 请求数据
    ajax({
        url: options.url,
        method: 'POST',
        data: options.params,
        success: function(res) {
            if (res.code === 1) {
                // 渲染数据
                const container = document.querySelector(options.container);
                if (container && options.render && typeof options.render === 'function') {
                    container.innerHTML = options.render(res.data.list);
                }
                
                // 渲染分页
                const pagingContainer = document.querySelector(options.pagingContainer);
                if (pagingContainer) {
                    pagingContainer.innerHTML = renderPagination(res.data.page, res.data.total_page);
                }
                
                // 绑定分页事件
                bindPaginationEvents(function(page) {
                    options.params.page = page;
                    loadPage(options);
                });
            } else {
                showToast(res.msg || '加载失败');
            }
        },
        error: function() {
            showToast('网络错误，请稍后重试');
        }
    });
}

/**
 * 渲染分页
 * @param {number} page 当前页码
 * @param {number} totalPage 总页数
 * @return {string} 分页HTML
 */
function renderPagination(page, totalPage) {
    if (totalPage <= 1) {
        return '';
    }
    
    page = parseInt(page);
    totalPage = parseInt(totalPage);
    
    let html = '<div class="pagination">';
    
    // 首页
    if (page <= 1) {
        html += '<span class="disabled">首页</span>';
        html += '<span class="disabled">上一页</span>';
    } else {
        html += '<a href="javascript:;" data-page="1">首页</a>';
        html += '<a href="javascript:;" data-page="' + (page - 1) + '">上一页</a>';
    }
    
    // 页码下拉
    html += '<select class="page-select">';
    for (let i = 1; i <= totalPage; i++) {
        html += '<option value="' + i + '"' + (i === page ? ' selected' : '') + '>' + i + '</option>';
    }
    html += '</select>';
    
    // 下一页和末页
    if (page >= totalPage) {
        html += '<span class="disabled">下一页</span>';
        html += '<span class="disabled">末页</span>';
    } else {
        html += '<a href="javascript:;" data-page="' + (page + 1) + '">下一页</a>';
        html += '<a href="javascript:;" data-page="' + totalPage + '">末页</a>';
    }
    
    html += '</div>';
    
    return html;
}

/**
 * 绑定分页事件
 * @param {Function} callback 回调函数
 */
function bindPaginationEvents(callback) {
    // 页码链接点击
    const pageLinks = document.querySelectorAll('.pagination a[data-page]');
    for (let i = 0; i < pageLinks.length; i++) {
        pageLinks[i].addEventListener('click', function() {
            const page = parseInt(this.getAttribute('data-page'));
            if (callback && typeof callback === 'function') {
                callback(page);
            }
        });
    }
    
    // 页码下拉变化
    const pageSelect = document.querySelector('.pagination .page-select');
    if (pageSelect) {
        pageSelect.addEventListener('change', function() {
            const page = parseInt(this.value);
            if (callback && typeof callback === 'function') {
                callback(page);
            }
        });
    }
}

/**
 * 图片压缩
 * @param {File} file 图片文件
 * @param {Function} callback 回调函数
 */
function compressImage(file, callback) {
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = function(e) {
        const img = new Image();
        img.src = e.target.result;
        
        img.onload = function() {
            const maxWidth = 1280;
            let width = img.width;
            let height = img.height;
            
            // 压缩尺寸
            if (width > maxWidth) {
                height = Math.round((height * maxWidth) / width);
                width = maxWidth;
            }
            
            const canvas = document.createElement('canvas');
            canvas.width = width;
            canvas.height = height;
            
            const ctx = canvas.getContext('2d');
            ctx.drawImage(img, 0, 0, width, height);
            
            // 转换为Blob
            canvas.toBlob(function(blob) {
                if (callback && typeof callback === 'function') {
                    callback(blob);
                }
            }, file.type || 'image/jpeg', 0.8);
        };
    };
}

/**
 * 文件上传
 * @param {File} file 文件
 * @param {string} url 上传地址
 * @param {Function} progress 进度回调
 * @param {Function} callback 完成回调
 */
function uploadFile(file, url, progress, callback) {
    const xhr = new XMLHttpRequest();
    const formData = new FormData();
    
    formData.append('file', file);
    
    xhr.open('POST', url, true);
    
    xhr.upload.onprogress = function(e) {
        if (e.lengthComputable && progress && typeof progress === 'function') {
            const percent = Math.round((e.loaded / e.total) * 100);
            progress(percent);
        }
    };
    
    xhr.onreadystatechange = function() {
        if (xhr.readyState === 4) {
            if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) {
                let response;
                try {
                    response = JSON.parse(xhr.responseText);
                } catch (e) {
                    response = xhr.responseText;
                }
                
                if (callback && typeof callback === 'function') {
                    callback(true, response);
                }
            } else {
                if (callback && typeof callback === 'function') {
                    callback(false, xhr.statusText);
                }
            }
        }
    };
    
    xhr.send(formData);
}

/**
 * 获取URL参数
 * @param {string} name 参数名
 * @return {string} 参数值
 */
function getUrlParam(name) {
    const reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)');
    const r = window.location.search.substr(1).match(reg);
    if (r != null) return decodeURIComponent(r[2]);
    return null;
}

/**
 * 确认提示
 * @param {string} message 提示消息
 * @param {Function} callback 回调函数
 */
function confirm(message, callback) {
    showModal('确认', message, [
        {
            text: '取消',
            class: 'btn btn-cancel',
            onClick: function(e) {
                const mask = document.querySelector('.mask');
                if (mask) {
                    document.body.removeChild(mask);
                }
            }
        },
        {
            text: '确定',
            class: 'btn btn-primary',
            onClick: function(e) {
                const mask = document.querySelector('.mask');
                if (mask) {
                    document.body.removeChild(mask);
                }
                
                if (callback && typeof callback === 'function') {
                    // 使用setTimeout来确保先完成DOM操作，再执行回调
                    setTimeout(function() {
                        callback();
                    }, 10);
                }
            }
        }
    ]);
}
